Создание объектов JavaBean J2C с помощью сценариев Ant

Сценарии Ant, позволяющие вызывать компоненты J2C, можно запускать как из рабочей среды, так и с помощью командной строки.

В некоторых случаях может потребоваться заново создать объекты JavaBean J2C или связывания данных (например, если рабочий документ COBOL добавляет новое поле). Для этой цели можно использовать файл определения Ant, который имитирует взаимодействие между пользователем и компонентами J2C.

Мастеры J2C, отслеживающие выбираемые опции и вводимые значения, позволяют быстро создать файл конфигурации Ant. Поскольку файл конфигурации Ant соответствует формату XML, при необходимости его можно создать или изменить вручную.

Файл конфигурации Ant состоит из дерева целевых объектов, в которых выполняются различные задачи. Для обработки задач, связанных с целевым объектом, применяется конвейер. Каждая задача запускается объектом, который реализует конкретный интерфейс. При вызове файла конфигурации Ant в реализующие объекты задач загружаются свойства соответствующих задач. После загрузки информации вызывается объект задачи.

Задача поиска данных

Как правило, цикл поиска состоит из двух этапов, за каждый из которых отвечает отдельный компонент:
  • • Агенты поиска выполняют импорт данных (задача performImport в примере сценария) для создания метаданных, называемых результатами импорта.
  • • Загрузчики ресурсов (задача writeToWorkspace в примере сценария) на основе результатов импорта создают соответствующие артефакты приложения.
В ходе импорта и создания агент поиска и загрузчик ресурсов предусматривают взаимодействие с пользователем. Например, на этапе запроса агент поиска отправляет запрос в хранилище метаданных на основе уникального набора параметров. Путем совместного использования агента поиска и загрузчика ресурсов можно импортировать и создавать различные артефакты. Для их идентификации применяются имена (QName). Например, агенту поиска Cobol присвоено следующее имя: {com/ibm/adapter}CobolDiscoveryAgent
В следующем примере сценария создаются классы интерфейса Java J2C, реализации Java J2C и связывания данных на основе файла taderc99.cbl и импортируется ECIResourceAdapter версии 6.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. Раздел Import сценария 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. Раздел Write сценария 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) дополнительно требуется создать связывание. Раздел Binding сценария 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 - метод Java для обращения к EIS.
      • name - имя метода.
      • input - тип входных данных.
      • output - тип выходных данных.
      • interactioSpec - список свойств взаимодействия.
    • connectionSpec - список свойств соединения.
    • resourceAdapter - адаптер ресурса (имя проекта или список свойств).
  5. Завершив настройку свойств, следует выполнить команду, вызывающую API для импорта или создания артефактов.
Прим.: В ходе работы со сценариями Ant учитывайте следующие рекомендации:
  • Адаптер ресурса, вызываемый в сценарии Ant, следует предварительно импортировать в рабочую область.
  • Пути к ресурсам должны быть указаны относительно рабочей области или проекта, либо должны быть указаны полные пути.
  • Для обращения к агентам поиска и загрузчикам ресурсов используются уникальные имена (QName). Список всех зарегистрированных агентов поиска, загрузчиков ресурсов и конфигураций импорта можно просмотреть с помощью сценария displayAll.xml , расположенного в каталоге сценариев.
  • Некоторые элементы содержат пару атрибутов name и value. Атрибут name - это внутреннее свойство агента поиска или загрузчика ресурсов, применяемое для передачи значения. Важно получить имя правильным образом. Если компонент не сможет распознать имя, значение не будет задано. Во всех случаях эти атрибуты входят в состав тега propertyElement со значением множественности один-к-нескольким. Такая же множественность применима к тегу methodElement.
Ниже приведен пример сценария, создающего связывание данных на основе указанного файла COBOL (taderc99.ccp). Сценарий расположен в каталоге script модуля com.ibm.adapter.command.
<?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) дополнительно требуется создать связывание интерфейса. В следующем примере показан раздел поиска данных сценария Ant, применяемый для создания JavaBean J2C:

<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 - метод Java™ для обращения к EIS.
    • 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). Список всех зарегистрированных агентов поиска, загрузчиков ресурсов и конфигураций импорта можно просмотреть с помощью сценария displayAll.xml, расположенного в каталоге примеров.

В сценариях показано, что значения, передаваемые агентам поиска и загрузчиками ресурсов, определяются с помощью тегов propertyGroup и propertyElement. Группа свойств задает логическую группировку свойств путем применения вложенной структуры. Описание структуры, вложенной группы и имен свойств должно быть приведено в документации по агенту поиска или загрузчику ресурсов.

Свойства определяются как пара атрибутов name и value. Атрибут name - это внутреннее свойство агента поиска или загрузчика ресурсов, применяемое для передачи значения. Важно получить имя правильным образом. Если компонент не сможет распознать имя, значение не будет задано.


Комментарии