Construindo Beans J2C Usando Scripts Ant

É possível usar scripts Ant para chamar componentes J2C, e esses scripts Ant podem ser chamados a partir do ambiente de trabalho ou da linha de comandos.

Antes de Iniciar

Em algumas situações, talvez você queira recriar os beans J2C ou os beans de ligação de dados (por exemplo, se o seu copybook COBOL incluir um novo campo). É possível recriar seus beans J2C usando um arquivo de definição Ant que imite a interação entre o usuário e os componentes J2C subjacentes.

Sobre Esta Tarefa

É possível usar os assistentes J2C para criar um arquivo de configuração Ant capturando suas seleções e os valores inseridos. Como um arquivo de configuração Ant é essencialmente um arquivo XML, ele pode ser modificado ou totalmente construído à mão.

Um arquivo de configuração Ant consiste em uma árvore de destino na qual várias tarefas são executadas. Tarefas dentro de um destino são processadas em um pipeline. Cada tarefa é executada por um objeto que implementa uma determinada interface de tarefa. Quando o arquivo de configuração Ant é chamado, propriedades correspondentes a cada tarefa são carregadas nos objetos da tarefa de implementação. Após as informações serem carregadas, o objeto de tarefa é chamado.

Tarefa de descoberta de dados

Em geral, um ciclo de descoberta tem duas etapas, sendo que cada uma é executada por um componente distinto:
  • Agentes de descoberta executam a importação real dos dados (consulte a tarefa performImport no script de amostra) para produzir metadados do proprietário chamados de import result.
  • Gravadores de recursos consomem o resultado da importação (consulte a tarefa writeToWorkspace no script de exemplo) para produzir artefatos de aplicativo apropriados.
Durante as etapas de importação e geração, o agente de descoberta e o gravador de recursos requerem que um conjunto de entradas do usuário seja fornecido. Por exemplo, na fase Consulta, cada agente de descoberta tem um conjunto diferente de parâmetros que são usados para definir uma consulta no repositório de metadados correspondente. O agente de descoberta e o gravador de recurso podem se unir de várias maneiras para importar e gerar o artefato desejado. Eles são identificados pelo nome (QName). Por exemplo, o agente de descoberta Cobol pode ser identificado pelo seguinte nome: {com/ibm/adapter}CobolDiscoveryAgent
O script de exemplo a seguir mostra como gerar a interface Java™ J2C, a implementação de Java J2C e as classes de ligação de dados baseadas no arquivo COBOL taderc99.cbl e importar o ECIResourceAdapter versão 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>

Procedimento

  1. Exemplo da seção Import do script Ant:
    <discoveryAgent type="DiscoveryAgentName">
    		<importResource name="PropertyName" value="PropertyValue"/>
    		<importProperties>
    			<propertyElement name="PropetyName" value="PropertyValue"/>
    		</importProperties>
    		<searchParameters>
    			<propertyElement name="ParameterName"/>
    		</searchParameters>
    </discoveryAgent>
    Em que:
    • discoveryAgent é o nome do agente de descoberta a ser usado para importação
    • importResource é o recurso a ser importado
    • queryProperties é uma lista de parâmetros que representam as informações necessárias para formar uma consulta com relação ao repositório de metadados
    • searchParameters são os nós de seleção na árvore de resultados que você deseja importar como artefatos de aplicativo
    • propertyElement é uma lista (pares de nome de propriedade e valor de propriedade)
  2. Para gerar o artefato de aplicativo, um gravador de recurso que sabe consumir o resultado da importação é chamado. Por exemplo, após uma importação COBOL, apenas um gravador que sabe consumir o resultado da importação do tipo COBOL pode ser usado. A seção write do script Ant é semelhante à seguinte:
    <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>
    Em que:
    • workspaceResourceWriter é o nome do gravador usado para gerar os artefatos de aplicativo.
    • propertyElement é uma lista de pares de nome de propriedade e valor de propriedade que o gravador usa para geração.
  3. No caso especial de importação de linguagem (COBOL, C e PL/I), há uma etapa adicional, que é a geração de ligação. A seção binding do script Ant é semelhante à seguinte:
    <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. O resourceAdapter também pode ser definido da seguinte forma:
    <resourceAdapter>
         <propertyElement name="displayName" value="PropertyValue"/>
         <propertyElement name="version" value="PropertyValue"/>
         <propertyElement name="vendorName" value="PropertyValue"/>
    </resourceAdapter>
    Em que:
    • createBinding define o nome de classe de ligação da interface e do pacote
    • methodElement é o método Java para acessar o Enterprise Information System
      • name é o nome do método
      • input é o tipo de entrada
      • output é o tipo de saída
      • interactioSpec é uma lista de propriedades de interação
    • connectionSpec é uma lista de propriedades de conexão
    • resourceAdapter é o adaptador de recursos usado especificando o nome do projeto ou uma lista de propriedades
  5. Após as propriedades serem configuradas, é possível executar um comando que chame a API subjacente para conduzir a importação ou a geração de artefato.

Exemplo

Nota: Lembre-se destas diretrizes ao usar seus scripts Ant:
  • Se você estiver chamando um adaptador de recursos em seu script Ant, o adaptador de recursos deverá ser importado na área de trabalho antes de você chamar o script Ant.
  • Qualquer recurso usado deve ter um caminho de arquivo que aponte para a área de trabalho e o projeto ou um caminho de sistema de arquivos completo.
  • Agentes de descoberta e gravador de área de trabalho são referidos por nome (QName), que é identificado exclusivamente. Para localizar todos os agentes de descoberta registrados, gravadores de recurso da área de trabalho e configurações de importação, use o script displayAll.xml localizado no diretório de script.
  • Alguns dos elementos devem ter um par de atributos de nome e valor. O nome é, de fato, uma propriedade definida internamente pelo agente de descoberta ou gravador de recurso e usada para passar o valor. É importante obter o nome correto. Se o nome não for reconhecido pelo componente, o valor não será configurado. Esses atributos sempre fazem parte de uma tag propertyElement que tem a multiplicidade um-para-muitos. A mesma multiplicidade se aplica à tag methodElement.
O exemplo de script a seguir gera uma ligação de dados baseada no arquivo COBOL (taderc99.ccp) especificado. O script pode ser localizado no diretório de script de plug-in 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> 
em que:
  • importResource define o recurso a ser importado
  • queryProperties são os parâmetros que representam informações necessárias para formar uma consulta com relação ao repositório de metadados
  • managedConnectionFactory define as propriedades do connection factory
  • queryResult são os nós de seleção na árvore de resultados que você deseja importar como artefatos de aplicativo
  • propertyGroup é a estrutura contendo as propriedades e seus valores.

Tarefa de Geração de Serviço

No caso especial de importação de linguagem (COBOL, C e PL/I), há uma etapa adicional que envolve a geração da ligação de interface. O exemplo a seguir descreve a seção de descoberta de dados do script Ant usado para gerar um bean J2C:

  <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>
em que:
  • buildService define o nome de classe de ligação da interface e do pacote
  • method é o método Java™ para acessar o EIS
    • methodName é o nome do método
    • methodInput é o tipo de entrada
    • methodOutput é o tipo de saída
    • interactionSpec é uma lista de propriedades de interação
  • managedConnectionFactory define as propriedades do connection factory
  • connectionSpec é a classe de conexão usada
  • resourceAdapter é o adaptador de recursos usado especificando o nome do projeto ou uma lista de propriedades

Tarefas Adicionais

Outras tarefas do utilitário são úteis, mas não necessárias para gerar um artefato.

A tarefa createProject cria um projeto de área de trabalho.
<adapter:createProject 
		projectName="taderc99Project" 
		projectType="Web" 
		runtimeName="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
em que:
  • projectName é o nome do projeto
  • projectType é o tipo que pode ser Java, Web e EJB, sem distinção entre maiúsculas e minúsculas
  • runtimeName (opcional) é o nome do tempo de execução, conforme definido em Janela > Preferências > Servidor > Tempos de Execução Instalados
  • addToEAR (opcional) os valores válidos são
    • yes
    • no
    • true
    • false
  • EARProjectName (opcional) é o nome do projeto EAR
A tarefa importResourceAdapter cria um projeto de conector.
<j2c:importResourceAdapter 
		connectorModule="cicseci602"
		connectorFile="D:\IBM\SDP70\ResourceAdapters\cics15\cicseci602.rar" 
		targetRuntime="J2EE Runtime Library"
		addToEAR="yes"
		EARProjectName="TestEAR"/>
em que:

Definindo Propriedades

Agentes de descoberta e gravadores de área de trabalho são referidos por seus nomes exclusivos (QName). Para localizar todos os agentes de descoberta registrados, gravadores de recurso da área de trabalho e configurações de importação, use o script displayAll.xml localizado no diretório de amostra.

Conforme observado nos scripts de exemplo, os valores que são passados para os agentes de descoberta ou gravadores de recurso são definidos pelas tags propertyGroup e propertyElement. Um grupo de propriedades define um agrupamento lógico de propriedades por meio de uma estrutura aninhada. O layout da estrutura e os nomes de propriedade e grupo são descritos na documentação do agente de descoberta ou gravador de recurso.

Propriedades são definidas por um par de atributos de nome-valor. O nome é uma propriedade definida internamente pelo agente de descoberta ou gravador de recurso e é usada para passar o valor. É importante obter o nome correto. Se o nome não for reconhecido pelo componente, o valor não será configurado.


Feedback