使用 Ant 脚本构建 J2C Java bean

可以使用 Ant 脚本来调用 J2C 组件,而这些 Ant 脚本则可以从工作台或者命令行调用。

在某些情况下(例如,COBOL 副本添加了新字段),您可能想重建 J2C Java™ bean 和/或数据绑定 bean。现在,通过使用将模拟用户与底层 J2C 组件之间的交互的 Ant 定义文件也可以完成此重建任务。

通过使用 J2C 向导捕获您所选择的内容和已输入的值,就可以快速创建 Ant 配置文件。由于 Ant 配置文件实质上是一个 XML 文件,因此,可以完全手工修改或者构建此文件。

Ant 配置文件由运行各种任务的目标树组成。目标中的任务以管道形式处理。每个任务由实现特定任务界面的对象运行。当调用 Ant 配置文件时,就会将与每个任务相对应的属性装入实现任务对象中。装入了信息之后,就会调用任务对象。

数据发现任务

通常,发现周期中涉及到两个步骤,每个步骤是由不同组件完成的:
  • • 发现代理程序执行实际的数据导入(请参阅示例脚本中的 performImport 任务)以生成称为导入结果的专有元数据。
  • • 资源写程序使用该导入结果(请参阅示例脚本中的 writeToWorkspace 任务)来生成适当的应用程序工件。
在导入和生成步骤中,“发现代理程序”和“资源写程序”都要求提供一组用户输入。例如,在“查询”阶段,每个“发现代理程序”都将有不同的一组参数,这些参数用来定义对相应元数据存储库的查询。“发现代理程序”和“资源写程序”可以按各种方式配对,以导入和生成期望的工件。它们是由其名称(QName)标识的。例如,“Cobol 发现代理程序”可以由以下名称标识:{com/ibm/adapter}CobolDiscoveryAgent
以下脚本示例说明了如何根据 COBOL 文件 taderc99.cbl 来生成 J2C java 接口、J2C java 实现以及数据绑定类,还说明了如何导入 ECIResourceAdapter V6.0.2。
<adapter:discover>
	<adapter:performImport agent="{com/ibm/adapter}CobolDiscoveryAgent">
		<adapter:importResource>
			<adapter:propertyGroup name="CobolFileGroup">
				<adapter:propertyElement name="CobolFile" value="/${project}/taderc99.ccp"/>
			</adapter:propertyGroup>
		</adapter:importResource>
		<adapter:queryProperties>
			<adapter:propertyGroup name="ImportProperties">
				<adapter:propertyElement name="Platform" value="Win32"/>
			</adapter:propertyGroup>
		</adapter:queryProperties>
		<adapter:queryResult>
			<adapter:selectElement name="DFHCOMMAREA"/>
		</adapter:queryResult>
	</adapter:performImport>
	<adapter:writeToWorkspace writer="{com/ibm/adapter/cobol/writer}JAVA_WRITER">
		<adapter:propertyGroup name="COBOLToJavaResourceWriter">
			<adapter:propertyElement name="GenerationStyle" value="0"/>
			<adapter:propertyGroup name="Java Type Name">
				<adapter:propertyElement name="Overwrite existing class" value="true"/>
				<adapter:propertyElement name="Project Name" value="${project}"/>
				<adapter:propertyElement name="Package Name" value="com.ibm.test"/>
				<adapter:propertyElement name="Class Name" value="Taderc99"/>
			</adapter:propertyGroup>
		</adapter:propertyGroup>
	</adapter:writeToWorkspace>
</adapter:discover>
  1. Ant 脚本的导入部分看起来类似于:
    <discoveryAgent type="DiscoveryAgentName">
    		<importResource name="PropertyName" value="PropertyValue"/>
    		<importProperties>
    			<propertyElement name="PropetyName" value="PropertyValue"/>
    		</importProperties>
    		<searchParameters>
    			<propertyElement name="ParameterName"/>
    		</searchParameters>
    </discoveryAgent>
    其中:
    • discoveryAgent 是要用于导入的“发现”代理程序的名称
    • importResource 是要导入的资源
    • queryProperties 是用来表示对元数据存储库进行查询所需要的信息的参数列表
    • searchParameters 是结果树上期望作为应用程序工件导入的选择节点
    • propertyElement 是一个列表(成对的属性名与属性值)
  2. 为了生成应用程序工件,将调用要使用已导入的结果的“资源写程序”。例如,在导入 COBOL 类型之后,只能使用要使用 COBOL 类型的“导入结果”的写程序。Ant 脚本的写入部分类似于:
    	<adapter:writeToWorkspace writer="{com/ibm/adapter/cobol/writer}JAVA_WRITER">
    		<adapter:propertyGroup name="COBOLToJavaResourceWriter">
    			<adapter:propertyGroup name="Java Type Name">
    <adapter:propertyElement name="Project Name" value="${project1}"/>
    <adapter:propertyElement name="Package Name" value="sample.cics"/>
    <adapter:propertyElement name="Class Name" value="DFHCOMMAREA"/>
    			</adapter:propertyGroup>
    			</adapter:propertyGroup>
    </adapter:writeToWorkspace>
    其中:
    • workspaceResourceWriter 是用来生成应用程序工件的写程序的名称
    • propertyElement 是写程序用于生成的一个列表(成对的属性名与属性值)
  3. 在语言导入(COBOL、C 和 PL/I)这种特殊情况下,还有一个附加步骤,即,生成绑定。Ant 脚本的绑定部分类似于:
    <createBinding package="PackageName" class="ClassName">
        <methodElement>
            <name value="MethodName"/>
            <input value="Input"/>
            <output value="Output"/>
            <interactioSpec>
                <propertyElement name="PropertyName" value="PropetyValue"/>
            </interactioSpec>
        </methodElement>
        <connectionSpec>
            <propertyElement name="PropertyName" value="PropertyValue"/>
        </connectionSpec>
        <resourceAdapter project="ResourceAdapterProjectName"/>
    </createBinding>
  4. 还可以采用以下方法来定义 resourceAdapter
    <resourceAdapter>
         <propertyElement name="displayName" value="PropertyValue"/>
         <propertyElement name="version" value="PropertyValue"/>
         <propertyElement name="vendorName" value="PropertyValue"/>
    </resourceAdapter>
    其中:
    • createBinding 定义包和接口绑定类名
    • methodElement 是用来访问 EIS 的 Java 方法
      • name 是方法的名称
      • input 是输入类型
      • output 是输出类型
      • interactioSpec 是交互属性的列表
    • connectionSpec 是连接属性的列表
    • resourceAdapter 是通过指定项目名称或属性列表而使用的资源适配器
  5. 设置了属性之后,就可以开始运行一个将调用底层 API 的命令来完成导入或生成工件。
注: 在使用 Ant 脚本时,应记住下列准则:
  • 如果要在 Ant 脚本中调用资源适配器,则在调用 Ant 脚本之前必须在工作空间中导入该资源适配器。
  • 使用的任何资源都必须具有指向工作空间和项目的文件路径,或者具有完整的文件系统路径。
  • “发现代理程序”和“工作空间写程序”是用其唯一标识地名称(QName)来指代的。要查找所有已注册的“发现代理程序”、“工作空间资源写程序”和“导入”配置,可使用在 script 目录中找到的 displayAll.xml 脚本。
  • 某些元素具有一对名称/值属性。名称实际上是“发现代理程序”或“资源写程序”在内部定义的一种属性,用来与值一起传递。使名称正确是很重要的。如果组件不识别名称,也就不会设置值。在所有情况下,这些属性都是 propertyElement 标记的一部分,该标记具有“一对多”多重性。相同的多重性也适用于 methodElement 标记。
以下脚本示例将根据指定的 COBOL 文件(taderc99.ccp)生成数据绑定。可以在 com.ibm.adapter.command 插件的 script 目录中找到该脚本。
<?xml version="1.0" encoding="UTF-8" ?> 
  <project xmlns:adapter="http://com.ibm.adapter" default="DataBinding1" name="/Taderc99/CustomerInfo.xml">
    <property name="debug" value="true" /> 
    <property name="project1" value="Taderc99" /> 
    <target name="DataBinding1">
  <adapter:createProject projectName="${project1}" projectType="Java" /> 
    <adapter:discover>
    	<adapter:performImport agent="{com/ibm/adapter}CobolDiscoveryAgent">
    		<adapter:importResource>
    			<adapter:propertyGroup name="CobolFileGroup">
  <adapter:propertyElement name="CobolFile" value="C:\Samples\CICS\taderc99\taderc99.cbl" /> 
  			</adapter:propertyGroup>
  		</adapter:importResource>
    		<adapter:queryProperties>
    			<adapter:propertyGroup name="ImportProperties">
  <adapter:propertyElement name="Platform" value="Win32" /> 
  <adapter:propertyElement name="Codepage" value="ISO-8859-1" /> 
  <adapter:propertyElement name="Numproc" value="PFD" /> 
  <adapter:propertyElement name="FloatingPointFormat" value="IEEE 754" /> 
    <adapter:propertyGroup name="ExternalDecimalSignGroup">
  <adapter:propertyElement name="ExternalDecimalSign" value="ASCII" /> 
  			</adapter:propertyGroup>
    <adapter:propertyGroup name="EndianGroup">
  <adapter:propertyElement name="Endian" value="Little" /> 
  <adapter:propertyElement name="RemoteEndian" value="Little" /> 
  			</adapter:propertyGroup>
    <adapter:propertyGroup name="CompileOptions">
  <adapter:propertyElement name="Quote" value="DOUBLE" /> 
  <adapter:propertyElement name="Trunc" value="STD" /> 
  <adapter:propertyElement name="Nsymbol" value="DBCS" /> 
  			</adapter:propertyGroup>
  			</adapter:propertyGroup>
  		</adapter:queryProperties>
    		<adapter:queryResult>
  <adapter:selectElement name="DFHCOMMAREA" /> 
  		</adapter:queryResult>
  	</adapter:performImport>
    	<adapter:writeToWorkspace writer="{com/ibm/adapter/cobol/writer}JAVA_WRITER">
    		<adapter:propertyGroup name="COBOLToJavaResourceWriter">
  <adapter:propertyElement name="GenerationStyle" value="Default" /> 
    			<adapter:propertyGroup name="Java Type Name">
  <adapter:propertyElement name="Project Name" value="${project1}" /> 
  <adapter:propertyElement name="Package Name" value="sample.cics" /> 
  <adapter:propertyElement name="Class Name" value="CustomerInfo" /> 
  <adapter:propertyElement name="Overwrite existing class" value="true" /> 
  			</adapter:propertyGroup>
  			</adapter:propertyGroup>
  </adapter:writeToWorkspace>
  </adapter:discover>
  <eclipse.refreshLocal depth="infinite" resource="${project1}" /> 
  <eclipse.incrementalBuild project="${project1}" /> 
  </target>
  </project> 
其中
  • • importResource 定义要导入的资源
  • • queryProperties 是用来表示对元数据存储库进行查询时所需信息的一些参数
  • managedConnectionFactory 定义连接工厂属性
  • • queryResult 是在结果树上选择的期望作为应用程序工件导入的节点
  • • propertyGroup 是包含属性及其值的结构。

服务生成任务

在语言导入(COBOL、C 和 PL/1)这种特殊情况下,还需要执行一个附加步骤,该步骤涉及到生成“接口绑定”。以下示例描述了用于生成 J2C Bean 的 Ant 脚本的数据发现部分:

<j2c:generateService>
	<j2c:buildService package="com.ibm.test" class="Taderc99Interface">
		<j2c:method>
			<j2c:methodName value="gettaderc99"/>
			<j2c:methodInput value="${project}/com/ibm/test/Taderc99.java">
				<j2c:argumentBinding property="commareaLength" propertyType="InteractionSpec" name="length" type="int"/>
			</j2c:methodInput>
			<j2c:methodOutput value="${project}/com/ibm/test/Taderc99.java"/>
			<j2c:interactionSpec class="com.ibm.connector2.cics.ECIInteractionSpec">
				<adapter:propertyGroup name="InteractionSpec property group">
					<adapter:propertyElement name="functionName" value="TADERC99"/>
				</adapter:propertyGroup>
			</j2c:interactionSpec>
		</j2c:method>
		<j2c:managedConnectionFactory class="com.ibm.connector2.cics.ECIManagedConnectionFactory" target="myJNDIName">
			<adapter:propertyGroup name="Managed connection property group">
				<adapter:propertyGroup name="Server">
					<adapter:propertyElement name="ConnectionURL" value="rubicon.torolab.ibm.com"/>
					<adapter:propertyElement name="ServerName" value="rubicon"/>
				</adapter:propertyGroup>
				<adapter:propertyGroup name="UserVerification">
					<adapter:propertyElement name="UserName" value="sysad"/>
					<adapter:propertyElement name="Password" value="sysad"/>
				</adapter:propertyGroup>
			</adapter:propertyGroup>
		</j2c:managedConnectionFactory>
		<j2c:connectionSpec class="com.ibm.connector2.cics.ECIConnectionSpec"/>
		<j2c:resourceAdapter project="CICS ECI"/>
	</j2c:buildService>
	<adapter:writeToWorkspace writer="com/ibm/adapter/j2c/codegen:J2CAnnotationWriter">
		<adapter:propertyGroup name="J2C Writer Properties">
			<adapter:propertyElement name="Project" value="${project}"/>
			<adapter:propertyElement name="InterfaceName" value="Taderc99Interface"/>
			<adapter:propertyElement name="BindingName" value="Taderc99Binding"/>
			<adapter:propertyElement name="PackageName" value="com.ibm.test"/>
			<adapter:propertyGroup name="CommandBean">
				<adapter:propertyGroup name="gettaderc99">
					<adapter:propertyElement name="EnableGenerate" value="true"/>
					<adapter:propertyElement name="CommandBeanName" value="Taderc99CICSECIServiceProxy"/>
					<adapter:propertyElement name="Input" value="Taderc99Part"/>
					<adapter:propertyElement name="Output" value="Taderc99Part"/>
				</adapter:propertyGroup>
			</adapter:propertyGroup>
		</adapter:propertyGroup>
    </adapter:writeToWorkspace>
</j2c:generateService>
其中
  • buildService 定义包和接口绑定类名
  • method 是用来访问 EIS 的 Java™ 方法
    • methodName 是方法的名称
    • methodInput 是输入类型
    • methodOutput 是输出类型
    • interactionSpec 是交互属性列表
  • managedConnectionFactory 定义连接工厂属性
  • connectionSpec 是所使用的连接类
  • resourceAdapter 是通过指定项目名称或属性列表而使用的资源适配器

其他任务

实用程序任务对于生成工件很有用,但不是必须执行的任务。

可以使用 createProject 任务来创建工作空间项目。
<adapter:createProject 
		projectName="taderc99Project" 
		projectType="Web" 
		runtimeName="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
其中
  • projectName 是项目的名称
  • projectType 是项目类型,可以为 Java、Web 和 EJB,不区分大小写
  • runtimeName 是可选的,它表示运行时名称,如“窗口 -> 首选项 -> 服务器 -> 已安装的运行时”中所定义的那样
  • addToEAR 是可选的,其有效值为:
    • yes
    • no
    • true
    • false
  • EARProjectName(可选)是 EAR 项目名称
可以使用 importResourceAdapter 任务来创建连接器项目。
<j2c:importResourceAdapter 
		connectorModule="cicseci602"
		connectorFile="D:\IBM\SDP70\ResourceAdapters\cics15\cicseci602.rar" 
		targetRuntime="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
其中

定义属性

“发现代理程序”和“工作空间写程序”是用其唯一标识地名称(QName)来指代的。要查找所有已注册的“发现代理程序”、“工作空间资源写程序”和“导入”配置,可使用在 sample 目录中找到的 displayAll.xml 脚本。

如示例脚本中所示,传递给发现代理程序或资源写程序的值是由 propertyGroup 和 propertyElement 标记定义的。属性组通过嵌套结构来定义属性的逻辑分组。应该在发现代理程序或资源写程序文档中描述结构布局及其包含的组名和属性名。

属性(Property)是由一对名称/值属性(attribute)定义。名称实际上是“发现代理程序”或“资源写程序”在内部定义的一种属性(property),用来与值一起传递。使名称正确是很重要的。如果组件不识别名称,也就不会设置值。


反馈