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

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

Прежде чем начать

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

Об этой задаче

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

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

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

Обычно цикл поиска состоит из двух этапов, за каждый из которых отвечает отдельный компонент:
  • Агенты поиска выполняют импорт данных (задача performImport в примере сценария) для создания частных метаданных, называемых результатом импорта.
  • Загрузчики ресурсов (задача writeToWorkspace в примере сценария) на основе результатов импорта создают соответствующие артефакты приложения.
В ходе этапов импорта и создания агент поиска и загрузчик ресурсов предусматривают взаимодействие с пользователем. Например, на этапе запроса каждый агент поиска отправляет запрос в хранилище метаданных на основе уникального набора параметров. Путем совместного использования агента поиска и загрузчика ресурсов можно импортировать и создавать различные артефакты. Для их идентификации применяются имена (QName). Например, агенту поиска Cobol может быть присвоено следующее имя: {com/ibm/adapter}CobolDiscoveryAgent
Следующий пример сценария демонстрирует, как создать классы интерфейса J2C Java™, реализации J2C Java и связывания данных на основе файла taderc99.cbl COBOL и импортированного 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 - это внутреннее свойство агента поиска или загрузчика ресурсов, применяемое для передачи значения. Важно правильно определить атрибут name. Если компонент не сможет распознать имя, значение не будет задано. Во всех случаях эти атрибуты входят в состав тега propertyElement со значением множественности один-к-нескольким. Такая же множественность применима к тегу methodElement.
Ниже приведен пример сценария, создающего связывание данных на основе указанного файла COBOL (taderc99.ccp). Сценарий расположен в каталоге сценариев модуля 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/I) дополнительно требуется создать связывание интерфейса. В следующем примере показан раздел поиска данных сценария Ant, применяемый для создания объекта J2C Java:

  <j2c:generateService>
            <j2c:buildService class="Customer" package="sample.cics">
                <j2c:method>
                    <j2c:methodName value="getCustomer"/>
                    <j2c:methodInput value="/Test/src/sample/cics/data/CustomerInfo.java"/>
                    <j2c:methodOutput value="/Test/src/sample/cics/data/CustomerInfo.java"/>
                    <j2c:interactionSpec class="com.ibm.connector2.cics.ECIInteractionSpec">
                        <adapter:propertyGroup name="INTERACTION_SPEC_PROPERTY_PG">
                            <adapter:propertyElement name="functionName" value="taderc99"/>
                            <adapter:propertyElement name="commareaLength" value="-1"/>
                            <adapter:propertyElement name="replyLength" value="-1"/>
                            <adapter:propertyElement name="executeTimeout" value="0"/>
                            <adapter:propertyElement name="interactionVerb" value="1"/>
                        </adapter:propertyGroup>
                    </j2c:interactionSpec>
                </j2c:method>
                <j2c:managedConnectionFactory class="com.ibm.connector2.cics.ECIManagedConnectionFactory" target="MyDefaultJNDIName">
                    <adapter:propertyGroup name="MANAGED_CONNECTION_FACTORY_CLASS_PROPERTIES">
                        <adapter:propertyGroup name="Server">
                            <adapter:propertyElement name="ConnectionURL" value="j2c"/>
                            <adapter:propertyElement name="ServerName" value="cics"/>
                        </adapter:propertyGroup>
                        <adapter:propertyGroup name="UserVerification">
                            <adapter:propertyElement name="UserName" value="sysad"/>
                            <adapter:propertyElement name="Password" value="susad"/>
                        </adapter:propertyGroup>
                        <adapter:propertyGroup name="Security"/>
                    </adapter:propertyGroup>
                </j2c:managedConnectionFactory>
                <j2c:connectionSpec class="com.ibm.connector2.cics.ECIConnectionSpec"/>
                <j2c:resourceAdapter project="${ra.project}"/>
            </j2c:buildService>
            <adapter:writeToWorkspace writer="{com/ibm/adapter/j2c/codegen/writer}J2CAnnotationWorkspaceResourceWriter">
                <adapter:propertyGroup name="J2C Java Bean Writer Properties">
                    <adapter:propertyElement name="Project" value="Test"/>
                    <adapter:propertyElement name="PackageName" value="sample.cics"/>
                    <adapter:propertyElement name="InterfaceName" value="Customer"/>
                </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 - это внутреннее свойство агента поиска или загрузчика ресурсов, применяемое для передачи значения. Важно правильно определить атрибут name. Если компонент не сможет распознать имя, значение не будет задано.


Комментарии